#include <ev.h>
#include <amqpcpp.h>
#include <amqpcpp/libev.h>
#include <openssl/ssl.h>
#include <openssl/opensslv.h>

int main()
{
    //实例化底层网络通信 框架的I/O 事件监控句柄
    auto *loop = EV_DEFAULT;
    //实例化libev handler句柄 将AMQP框架与事件监控连接起来
    AMQP::LibEvHandler handler(loop); 
    //实例化连接对象
    AMQP::Address address("amqp://root:299274142@127.0.0.1:5672/");
    AMQP::TcpConnection connection(&handler, address);
    //实例化信道对象
    AMQP::TcpChannel channel(&connection);
    //声明交换机
    channel.declareExchange("test-exchange", AMQP::ExchangeType::direct)
    .onError([](const char* message){
        std::cout << "声明交换机失败：" << message << std::endl;
        exit(0);
    })
    .onSuccess([](){
        std::cout << "声明交换机成功：" << std::endl;
    });
    //声明队列
    channel.declareQueue("test-queue")
    .onError([](const char* message){
        std::cout << "声明队列失败：" << message << std::endl;
        exit(0);
    })
    .onSuccess([](){
        std::cout << "声明队列成功：" << std::endl;
    });
    //针对交换机和队列进行 绑定
    channel.bindQueue("test-exchange", "test-queue", "test-queue") //routing key 同名就行
    .onError([](const char* message){
        std::cout << "交换机和队列进行 绑定失败：" << message << std::endl;
        exit(0);
    })
    .onSuccess([](){
        std::cout << "交换机和队列进行 绑定成功：" << std::endl;
    });
    //向交换机发布信息
    for(int i = 0; i < 10; i ++)
    {
        std::string msg = "hello - " + std::to_string(i);
        bool ret = channel.publish("test-exchange", "test-queue", msg);
        if(!ret)
        {
            std::cout << "publish false" << std::endl;
        }
    }
    //启动 io 事件监控
    ev_run(loop, 0);

    return 0;
}